查看原文
其他

Python 爬取疫情期间全球股市走向,笑不出来......

程序人生 2020-10-16

The following article is from 数据森麟 Author 徐麟


作者 | 徐麟
本文系作者投稿

前言
近期,受到新冠疫情的影响两周以来,全球股市都发生了大幅的下跌,其中美股市场更是在三月经历了四次熔断,堪称史诗级暴跌,虽然3月24日各国股市都有了大幅的回调,道琼斯指数涨幅也超过了10%,但是相较于之前的大幅下跌,依旧无法弥补此前的缺口。
本文将通过各国股市主要指数(如中国的沪市指数,美国的道琼斯指数等)在最近一个月的表现,对比各国股市在最近一个月内的跳水情况。本文后续将对比各国股市单日跌幅及整体跌幅,并且根据2019年GDP选取TOP20的国家作为重点国家进行对比。

数据获取
本文数据来源为英为财情网站,首先在网站中的导航页通过筛选,选择各国主要的指数,获取相应页面的URL,如下图所示:
由于该网站美国选择的主要指数为纳斯达克,后续我们会将相应url修改为道琼斯指数,更加能够代表美国股市整体的情况,之后会进入各国指数的详情页,通过抓取详情页的数据作为本文数据的来源:
部分代码如下:
html = requests.get(url,cookies=cookie, headers=header).content
bsObj = BeautifulSoup(html.decode('utf-8'),"html.parser")
title = bsObj.find_all('table',attrs={'class':'genTbl closedTbl crossRatesTbl elpTbl elp30'})
title = [k.find('td',attrs={'class':'bold left noWrap elp plusIconTd'}).find('a').attrs['href'for k in title]
url_all = ['https://cn.investing.com' + k + '-historical-data' for k in title]

global_index = pd.DataFrame(columns=['date','country','value','rate'])
err_list = []
for i in range(len(url_all)):
    try:
        url = url_all[i]
        html = requests.get(url,cookies=cookie, headers=header).content
        bsObj = BeautifulSoup(html.decode('utf-8'),"html.parser")
        country = bsObj.find('div',attrs={'class':'right'}).text.split('\n')[7]
        tables = bsObj.findAll('table')
        trs = tables[1].find_all('tr')
        date = [trs[i].find_all('td')[0].text for i in range(len(trs)) if i != 0]
        value = [trs[i].find_all('td')[1].text for i in range(len(trs)) if i != 0]
        rate = [trs[i].find_all('td')[6].text for i in range(len(trs)) if i != 0]
        global_index = global_index.append(pd.DataFrame({'date':date,'country':country,'value':value,
                                       'rate':rate}),ignore_index=True)
        trs = tables[0].find_all('tr')
        date = [trs[i].find_all('td')[0].text for i in range(len(trs)) if i != 0]
        value = [trs[i].find_all('td')[1].text for i in range(len(trs)) if i != 0]
        rate = [trs[i].find_all('td')[6].text for i in range(len(trs)) if i != 0]

        global_index = global_index.append(pd.DataFrame({'date':date,'country':country,'value':value,
                                       'rate':rate}),ignore_index=True)
        print('right'+str(i))
    except:
        err_list.append(i)
        print('wrong'+str(i))

global_index.to_excel('全球三月指数.xlsx')

最终获取的数据如下:


单日跳水排名

之后我们将对各国的跳水能力进行排名,首先要比较的是单日跳水情况,即单日的跌幅,由于我国股市设定了涨停和跌停的机制,所以在下面的榜单中将不会看到我国股市的身影,首先看的是所有国家单日跌幅的TOP10:
榜单中近期收到疫情影响较为严重的阅读量和西班牙都在榜单中,但是出人意料的是巴西,阿根廷,智利,哥伦比亚这些南美的国家却统治了这份榜单,哥伦比亚更是出现了单日22.21%的跌幅,下面看一下去年GDP前20的国家:
主要国家大的跌幅主要集中在3.12和3.16两天,巴西更是在绑定那种出现三次,收到的影响要大于欧洲主要的国家,美国道琼斯指数3.16创下的跌幅在榜单中排名第六,这也符合预期。
说完跳水,再来看下反弹,下面分别是所有国家和主要国家单日涨幅TOP 10:
可以看到单日涨幅排名前列的国家也基本上同样会出现在跌幅榜中,如果有人幸运地在合适的时机抄底(基本上不太可能)一定会赚的盆满钵满,然而也有可能不幸地踏空

总体跳水排名

下面我们将通过对比最近一个月指数的变化情况,更为直观地体现出股市的跳水情况,以各国2.24日的指数为基准,对比3.25日的指数与该基准的比率,首先展示的是全球股市跳水排行榜:
可以看到榜单中跳水最为严重的哥伦比亚最近一个月指数下降高达35%以上,另外在榜单中一些平时存在感不是很高的国家,如纳米比亚,塞浦路斯也出现在了榜单中,榜单中包括了发达国家和发展中国家,各国从经济发展的情况、地域上似乎很难找到一些相似之处。
下面再来看下20个重点国家的跳水情况:
榜单中的欧美各国缩水程度都在23%以上,这些国家也对全球整体的经济形势产生着巨大的影响,大家可能会做的就是在前两份榜单中寻找A股的身影,然而事实证明A股最近一个月还算是坚挺,下面看一下较为坚挺的股市排行榜。
唯一一个超过100(3.25指数高于2.24)的居然是厄瓜多尔,不知道这是一个怎样神奇的存在,另外各大网站显示改过指数停留在了3.16日,可能与这也有关系。我国最近一个月的跌幅小于10%,排名前十,下面再来看一下重点国家的数据:
从榜单中可以看到中日韩三国的跌幅相较于欧美各国要小很多,这也要归功于对疫情的有效控制,最后我们将重点国家最近一个月的数据做成了动态的条形图,让大家能够有更加直观的感受:
作者简介:徐麟,某互联网公司数据分析狮,个人公众号数据森麟(id:shujusenlin)

热 文 推 荐

为什么我们程序员不把软件开发当回事?

字节跳动武汉招聘 2000  人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划

开源的未来 10 年:中国开源社区建立是关键

人人都能读懂的「以太坊2.0分片设计」

旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020

为何你的 SaaS 想法总是失败?没想清楚这 4 个原因可能会继续失败!


你点的每个“在看”,我都认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存